<!DOCTYPE html>
<html lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>get_circle_pose [HALCON算子参考手册]</title>
<style type="text/css">
      body {
    color: #000000;
    background-color: #ffffff;
    margin: 0;
    font-family: Arial, Helvetica, sans-serif;
}

.body_main {
    margin-left: 35px;
    margin-right: 35px;
}

@media screen and (min-width:992px) {

    .body_main {
        margin-left: 10%;
        margin-right: 10%;
    }

    table.toctable {
        width: 80%
    }
}

@media screen and (min-width:1400px) {

    .body_main {
        margin-left: 15%;
        margin-right: 15%;
    }

    table.toctable {
        width: 70%
    }
}

body>div ul ul {
    margin-left: inherit;
}

a:link {
    color: #0044cc;
}

a:link,
a:visited {
    text-decoration: none;
}

a:link:hover,
a:visited:hover {
    text-decoration: underline;
}

th {
    text-align: left;
}

h1,
h2,
h3,
h4,
h5,
h6 {
    text-rendering: optimizeLegibility;
    color: #666666;
}

code {
    font-family: monospace,monospace;
}

h1 a.halconoperator {
    font-family: Arial, Helvetica, sans-serif;
    color: #666666;
}

h2 a.halconoperator {
    font-family: Arial, Helvetica, sans-serif;
    color: #666666;
}

hr {
    border: 0;
    border-top: solid 1px #f28d26;
}

.pre {
    display: block;
    padding-bottom: 1ex;
    font-family: monospace;
    white-space: pre;
}

pre {
    font-family: monospace, monospace;
    padding: 1ex;
    white-space: pre-wrap;
}

.toc {
    font-size: 80%;
    border-top: 1px dashed #f28d26;
    border-bottom: 1px dashed #f28d26;
    padding-top: 5px;
    padding-bottom: 5px;
}

.inv {
    margin: 0;
    border: 0;
    padding: 0;
}

.banner {
    color: #666666;
    padding-left: 1em;
}

.logo {
    background-color: white;
}

.keyboard {
    font-size: 80%;
    padding-left: 3px;
    padding-right: 3px;
    border-radius: 5px;
    border-width: 1px;
    border-style: solid;
    border-color: #f28d26;
    background-color: #f3f3f3;
}

.warning {
    margin-top: 2ex;
    margin-bottom: 1ex;
    padding: 10px;
    text-align: center;
    border: 1px solid;
    color: #bb0000;
    background-color: #fff7f7
}

.imprint {
    margin-top: 1ex;
    font-size: 80%;
    color: #666666;
}

.imprinthead {
    font-weight: bolder;
    color: #666666;
}

.indexlink {
    text-align: right;
    padding-bottom: 5px;
}

.postscript {
    margin-top: 2ex;
    font-size: 80%;
    color: #666666
}

.evenrow {
    background-color: #e7e7ef;
    vertical-align: top;
}

.oddrow {
    background-color: #f7f7ff;
    vertical-align: top;
}

.headrow {
    background-color: #97979f;
    color: #ffffff;
    vertical-align: top;
}

.logorow {
    vertical-align: top;
}

.error {
    color: red;
}

.var {
    font-style: italic
}

.halconoperator {
    font-family: monospace, monospace;
}

span.operator {
    font-family: monospace, monospace;
}

span.procedure {
    font-family: monospace, monospace;
}

span.operation {
    font-family: monospace, monospace;
}

span.feature {
    font-family: Arial, Helvetica, Homerton, sans-serif;
}

ul {
    padding-left: 1.2em;
}

li.dot {
    list-style-type: square;
    color: #f28d26;
}

.breadcrumb {
    font-size: 80%;
    color: white;
    background-color: #062d64;
    margin-bottom: 20px;
    padding-left: 35px;
    padding-right: 35px;
    padding-bottom: 15px;
}

.webbar {
    font-size: 80%;
    background-color: #dddddd;
    margin-top: 0px;
    margin-left: -35px;
    margin-right: -35px;
    margin-bottom: 0px;
    padding-top: 5px;
    padding-left: 35px;
    padding-right: 35px;
    padding-bottom: 5px;
}

.footer {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    border-top: 1px dashed #f28d26;
    font-size: 80%;
    color: #666666;
    padding-bottom: 8px;
}

.footer .socialmedia a {
    padding-left: 7px;
}

.socialmedia {
    padding-top: 10px;
}

.copyright {
    margin-top: 19px;
}

.breadcrumb a {
    color: #ffffff;
    border-bottom: 1px solid white;
}

.breadcrumb a:link:hover,
.breadcrumb a:visited:hover {
    text-decoration: none;
    border-bottom: none;
}

.heading {
    margin-top: 1ex;
    font-size: 110%;
    font-weight: bold;
    color: #666666;
}

.text {
    color: black;
}

.example {
    font-size: 80%;
    background-color: #f3f3f3;
    border: 1px dashed #666666;
    padding: 10px;
}

.displaymath {
    display: block;
    text-align: center;
    margin-top: 1ex;
    margin-bottom: 1ex;
}

.title {
    float: left;
    padding-top: 3px;
    padding-bottom: 3px;
}

.signnote {
    font-family: Arial, Helvetica, Homerton, sans-serif;
    font-size: 80%;
    color: #666666;
    font-weight: lighter;
    font-style: italic
}

.par {
    margin-bottom: 1.5em;
}

.parhead {
    text-align: right;
}

.parname {
    float: left;
}

.pardesc {
    font-size: 85%;
    margin-top: 0.5em;
    margin-bottom: 0.5em;
    margin-left: 2em;
}

.parcat {
    color: #666;
    font-weight: bold;
}

*[data-if=cpp],
*[data-if=c],
*[data-if=dotnet],
*[data-if=com],
*[data-if=python] {
    display: none;
}

.tabbar {
    text-align: right;
    border-bottom: 1px solid #f28d26;
    margin-bottom: 0.5em;
}

ul.tabs {
    padding-top: 3px;
    padding-bottom: 3px;
    margin-top: 10px;
    margin-bottom: 0;
    font-size: 80%
}

ul.tabs li {
    padding-top: 3px;
    padding-bottom: 3px;
    display: inline;
    overflow: hidden;
    list-style-type: none;
    margin: 0;
    margin-left: 8px;
    border-top: 1px solid #666;
    border-left: 1px solid #666;
    border-right: 1px solid #666;
}

ul.tabs li.active {
    border-left: 1px solid #f28d26;
    border-right: 1px solid #f28d26;
    border-top: 1px solid #f28d26;
    border-bottom: 1px solid #fff;
}

ul.tabs li.inactive {
    background-color: #eee;
}

ul.tabs li a {
    padding-left: 5px;
    padding-right: 5px;
    color: #666;
}

ul.tabs li a:link:hover {
    text-decoration: none;
}

ul.tabs li.inactive a {
    color: #666;
}

ul.tabs li.active a {
    color: black;
}

dl.generic dd {
    margin-bottom: 1em;
}

.pari {
    color: olive;
}

.paro {
    color: maroon;
}

.comment {
    font-size: 80%;
    color: green;
    white-space: nowrap;
}

table.grid {
    border-collapse: collapse;
}

table.grid td {
    padding: 5px;
    border: 1px solid;
}

table.layout {
    border: 0px;
}

table.layout td {
    padding: 5px;
}

table.table {
    border-collapse: collapse;
}

table.table td {
    padding: 5px;
    border-left: 0px;
    border-right: 0px;
}

table.table tr:last-child {
    border-bottom: 1px solid;
}

table.table th {
    padding: 5px;
    border-top: 1px solid;
    border-bottom: 1px solid;
    border-left: 0px;
    border-right: 0px;
}

.details_summary {
    cursor: pointer;
}

table.toctable {
    width: 100%;
}

table.toctable col:first-child {
    width: 20%;
}

table.toctable col:nth-last-child(2) {
    width: 8%;
}

table.altcolored tr:nth-child(even) {
    background-color: #f3f3f3;
}

    </style>
<!--OP_REF_STYLE_END-->
<script>
    <!--
var active_lang='hdevelop';function switchVisibility(obj,active_lang,new_lang)
{var display_style='inline';
for(var i=0;i<obj.length;i++)
{if(obj.item(i).getAttribute('data-if')==new_lang)
{obj.item(i).style.display=display_style;}
if(obj.item(i).getAttribute('data-if')==active_lang)
{obj.item(i).style.display='none';}}
return;}
function toggleLanguage(new_lang,initial)
{if(active_lang!=new_lang)
{var lis=document.getElementsByTagName('li');for(var i=0;i<lis.length;i++)
{if(lis.item(i).id=='syn-'+new_lang)
{lis.item(i).className='active';}
else
{lis.item(i).className='inactive';}}
var divs=document.getElementsByTagName('div');var spans=document.getElementsByTagName('span');switchVisibility(divs,active_lang,new_lang);switchVisibility(spans,active_lang,new_lang);if(!initial)
{setCookie("halcon_reference_language",new_lang,null,null);}
active_lang=new_lang;}
return;}
function setCookie(name,value,domain,exp_offset,path,secure)
{localStorage.setItem(name,value);}
function getCookie(name)
{return localStorage.getItem(name);}
function initialize()
{var qs=location.href.split('?')[1];var qs_lang_raw=location.href.split('interface=')[1];var qs_lang;if(qs_lang_raw)
{qs_lang=qs_lang_raw.split('#')[0];}
var cookie_lang=getCookie("halcon_reference_language");var new_lang;if((qs_lang=="hdevelop")||(qs_lang=="dotnet")||(qs_lang=="python")||(qs_lang=="cpp")||(qs_lang=="c"))
{new_lang=qs_lang;setCookie("halcon_reference_language",new_lang,null,null);}
else if((cookie_lang=="hdevelop")||(cookie_lang=="dotnet")||(cookie_lang=="python")||(cookie_lang=="cpp")||(cookie_lang=="c"))
{new_lang=cookie_lang;}
else
{new_lang="hdevelop";}
toggleLanguage(new_lang,1);return;}
-->

  </script>
</head>
<body onload="initialize();">
<div class="breadcrumb">
<br class="inv"><a href="index.html">目录</a> / <a href="toc_transformations.html">变换</a> / <a href="toc_transformations_poses.html">Poses</a><br class="inv">
</div>
<div class="body_main">
<div class="tabbar"><ul class="tabs">
<li id="syn-hdevelop" class="active"><a href="javascript:void(0);" onclick="toggleLanguage('hdevelop')" onfocus="blur()">HDevelop</a></li>
<li id="syn-dotnet" class="inactive"><a href="javascript:void(0);" onclick="toggleLanguage('dotnet')" onfocus="blur()">.NET</a></li>
<li id="syn-python" class="inactive"><a href="javascript:void(0);" onclick="toggleLanguage('python')" onfocus="blur()">Python</a></li>
<li id="syn-cpp" class="inactive"><a href="javascript:void(0);" onclick="toggleLanguage('cpp')" onfocus="blur()">C++</a></li>
<li id="syn-c" class="inactive"><a href="javascript:void(0);" onclick="toggleLanguage('c')" onfocus="blur()">C</a></li>
</ul></div>
<div class="indexlink">
<a href="index_classes.html"><span data-if="dotnet" style="display:none;">类别</span><span data-if="cpp" style="display:none;">类别</span></a><span data-if="dotnet" style="display:none;"> | </span><span data-if="cpp" style="display:none;"> | </span><a href="index_by_name.html">算子列表</a>
</div>
<!--OP_REF_HEADER_END-->
<h1 id="sec_name">
<span data-if="hdevelop" style="display:inline;">get_circle_pose</span><span data-if="c" style="display:none;">T_get_circle_pose</span><span data-if="cpp" style="display:none;">GetCirclePose</span><span data-if="dotnet" style="display:none;">GetCirclePose</span><span data-if="python" style="display:none;">get_circle_pose</span> (算子名称)</h1>
<h2>名称</h2>
<p><code><span data-if="hdevelop" style="display:inline;">get_circle_pose</span><span data-if="c" style="display:none;">T_get_circle_pose</span><span data-if="cpp" style="display:none;">GetCirclePose</span><span data-if="dotnet" style="display:none;">GetCirclePose</span><span data-if="python" style="display:none;">get_circle_pose</span></code> — Determine the 3D pose of a circle from its perspective 2D projection.
</p>
<h2 id="sec_synopsis">参数签名</h2>
<div data-if="hdevelop" style="display:inline;">
<p>
<code><b>get_circle_pose</b>(<a href="#Contour"><i>Contour</i></a> :  : <a href="#CameraParam"><i>CameraParam</i></a>, <a href="#Radius"><i>Radius</i></a>, <a href="#OutputType"><i>OutputType</i></a> : <a href="#Pose1"><i>Pose1</i></a>, <a href="#Pose2"><i>Pose2</i></a>)</code></p>
</div>
<div data-if="c" style="display:none;">
<p>
<code>Herror <b>T_get_circle_pose</b>(const Hobject <a href="#Contour"><i>Contour</i></a>, const Htuple <a href="#CameraParam"><i>CameraParam</i></a>, const Htuple <a href="#Radius"><i>Radius</i></a>, const Htuple <a href="#OutputType"><i>OutputType</i></a>, Htuple* <a href="#Pose1"><i>Pose1</i></a>, Htuple* <a href="#Pose2"><i>Pose2</i></a>)</code></p>
</div>
<div data-if="cpp" style="display:none;">
<p>
<code>void <b>GetCirclePose</b>(const HObject&amp; <a href="#Contour"><i>Contour</i></a>, const HTuple&amp; <a href="#CameraParam"><i>CameraParam</i></a>, const HTuple&amp; <a href="#Radius"><i>Radius</i></a>, const HTuple&amp; <a href="#OutputType"><i>OutputType</i></a>, HTuple* <a href="#Pose1"><i>Pose1</i></a>, HTuple* <a href="#Pose2"><i>Pose2</i></a>)</code></p>
<p>
<code><a href="HTuple.html">HTuple</a> <a href="HXLD.html">HXLD</a>::<b>GetCirclePose</b>(const HCamPar&amp; <a href="#CameraParam"><i>CameraParam</i></a>, const HTuple&amp; <a href="#Radius"><i>Radius</i></a>, const HString&amp; <a href="#OutputType"><i>OutputType</i></a>, HTuple* <a href="#Pose2"><i>Pose2</i></a>) const</code></p>
<p>
<code><a href="HTuple.html">HTuple</a> <a href="HXLD.html">HXLD</a>::<b>GetCirclePose</b>(const HCamPar&amp; <a href="#CameraParam"><i>CameraParam</i></a>, double <a href="#Radius"><i>Radius</i></a>, const HString&amp; <a href="#OutputType"><i>OutputType</i></a>, HTuple* <a href="#Pose2"><i>Pose2</i></a>) const</code></p>
<p>
<code><a href="HTuple.html">HTuple</a> <a href="HXLD.html">HXLD</a>::<b>GetCirclePose</b>(const HCamPar&amp; <a href="#CameraParam"><i>CameraParam</i></a>, double <a href="#Radius"><i>Radius</i></a>, const char* <a href="#OutputType"><i>OutputType</i></a>, HTuple* <a href="#Pose2"><i>Pose2</i></a>) const</code></p>
<p>
<code><a href="HTuple.html">HTuple</a> <a href="HXLD.html">HXLD</a>::<b>GetCirclePose</b>(const HCamPar&amp; <a href="#CameraParam"><i>CameraParam</i></a>, double <a href="#Radius"><i>Radius</i></a>, const wchar_t* <a href="#OutputType"><i>OutputType</i></a>, HTuple* <a href="#Pose2"><i>Pose2</i></a>) const  <span class="signnote">
            (
            Windows only)
          </span></code></p>
<p>
<code><a href="HTuple.html">HTuple</a> <a href="HCamPar.html">HCamPar</a>::<b>GetCirclePose</b>(const HXLD&amp; <a href="#Contour"><i>Contour</i></a>, const HTuple&amp; <a href="#Radius"><i>Radius</i></a>, const HString&amp; <a href="#OutputType"><i>OutputType</i></a>, HTuple* <a href="#Pose2"><i>Pose2</i></a>) const</code></p>
<p>
<code><a href="HTuple.html">HTuple</a> <a href="HCamPar.html">HCamPar</a>::<b>GetCirclePose</b>(const HXLD&amp; <a href="#Contour"><i>Contour</i></a>, double <a href="#Radius"><i>Radius</i></a>, const HString&amp; <a href="#OutputType"><i>OutputType</i></a>, HTuple* <a href="#Pose2"><i>Pose2</i></a>) const</code></p>
<p>
<code><a href="HTuple.html">HTuple</a> <a href="HCamPar.html">HCamPar</a>::<b>GetCirclePose</b>(const HXLD&amp; <a href="#Contour"><i>Contour</i></a>, double <a href="#Radius"><i>Radius</i></a>, const char* <a href="#OutputType"><i>OutputType</i></a>, HTuple* <a href="#Pose2"><i>Pose2</i></a>) const</code></p>
<p>
<code><a href="HTuple.html">HTuple</a> <a href="HCamPar.html">HCamPar</a>::<b>GetCirclePose</b>(const HXLD&amp; <a href="#Contour"><i>Contour</i></a>, double <a href="#Radius"><i>Radius</i></a>, const wchar_t* <a href="#OutputType"><i>OutputType</i></a>, HTuple* <a href="#Pose2"><i>Pose2</i></a>) const  <span class="signnote">
            (
            Windows only)
          </span></code></p>
</div>
<div data-if="com" style="display:none;"></div>
<div data-if="dotnet" style="display:none;">
<p>
<code>static void <a href="HOperatorSet.html">HOperatorSet</a>.<b>GetCirclePose</b>(<a href="HObject.html">HObject</a> <a href="#Contour"><i>contour</i></a>, <a href="HTuple.html">HTuple</a> <a href="#CameraParam"><i>cameraParam</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Radius"><i>radius</i></a>, <a href="HTuple.html">HTuple</a> <a href="#OutputType"><i>outputType</i></a>, out <a href="HTuple.html">HTuple</a> <a href="#Pose1"><i>pose1</i></a>, out <a href="HTuple.html">HTuple</a> <a href="#Pose2"><i>pose2</i></a>)</code></p>
<p>
<code><a href="HTuple.html">HTuple</a> <a href="HXLD.html">HXLD</a>.<b>GetCirclePose</b>(<a href="HCamPar.html">HCamPar</a> <a href="#CameraParam"><i>cameraParam</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Radius"><i>radius</i></a>, string <a href="#OutputType"><i>outputType</i></a>, out <a href="HTuple.html">HTuple</a> <a href="#Pose2"><i>pose2</i></a>)</code></p>
<p>
<code><a href="HTuple.html">HTuple</a> <a href="HXLD.html">HXLD</a>.<b>GetCirclePose</b>(<a href="HCamPar.html">HCamPar</a> <a href="#CameraParam"><i>cameraParam</i></a>, double <a href="#Radius"><i>radius</i></a>, string <a href="#OutputType"><i>outputType</i></a>, out <a href="HTuple.html">HTuple</a> <a href="#Pose2"><i>pose2</i></a>)</code></p>
<p>
<code><a href="HTuple.html">HTuple</a> <a href="HCamPar.html">HCamPar</a>.<b>GetCirclePose</b>(<a href="HXLD.html">HXLD</a> <a href="#Contour"><i>contour</i></a>, <a href="HTuple.html">HTuple</a> <a href="#Radius"><i>radius</i></a>, string <a href="#OutputType"><i>outputType</i></a>, out <a href="HTuple.html">HTuple</a> <a href="#Pose2"><i>pose2</i></a>)</code></p>
<p>
<code><a href="HTuple.html">HTuple</a> <a href="HCamPar.html">HCamPar</a>.<b>GetCirclePose</b>(<a href="HXLD.html">HXLD</a> <a href="#Contour"><i>contour</i></a>, double <a href="#Radius"><i>radius</i></a>, string <a href="#OutputType"><i>outputType</i></a>, out <a href="HTuple.html">HTuple</a> <a href="#Pose2"><i>pose2</i></a>)</code></p>
</div>
<div data-if="python" style="display:none;">
<p>
<code>def <b>get_circle_pose</b>(<a href="#Contour"><i>contour</i></a>: HObject, <a href="#CameraParam"><i>camera_param</i></a>: Sequence[Union[int, float, str]], <a href="#Radius"><i>radius</i></a>: MaybeSequence[float], <a href="#OutputType"><i>output_type</i></a>: str) -&gt; Tuple[Sequence[Union[float, int]], Sequence[Union[float, int]]]</code></p>
</div>
<h2 id="sec_description">描述</h2>
<p>Each ellipse in an image can be interpreted as the perspective projection
of a circle into the image. In fact, for a given radius of the circle,
there exist two differently oriented circles in 3D that result in
the same projection. <code><span data-if="hdevelop" style="display:inline">get_circle_pose</span><span data-if="c" style="display:none">get_circle_pose</span><span data-if="cpp" style="display:none">GetCirclePose</span><span data-if="com" style="display:none">GetCirclePose</span><span data-if="dotnet" style="display:none">GetCirclePose</span><span data-if="python" style="display:none">get_circle_pose</span></code> determines the 3D positions
and orientations of these two circles. First, each <a href="#Contour"><i><code><span data-if="hdevelop" style="display:inline">Contour</span><span data-if="c" style="display:none">Contour</span><span data-if="cpp" style="display:none">Contour</span><span data-if="com" style="display:none">Contour</span><span data-if="dotnet" style="display:none">contour</span><span data-if="python" style="display:none">contour</span></code></i></a>
is approximated by an ellipse. Then, based on the internal camera
parameters (<a href="#CameraParam"><i><code><span data-if="hdevelop" style="display:inline">CameraParam</span><span data-if="c" style="display:none">CameraParam</span><span data-if="cpp" style="display:none">CameraParam</span><span data-if="com" style="display:none">CameraParam</span><span data-if="dotnet" style="display:none">cameraParam</span><span data-if="python" style="display:none">camera_param</span></code></i></a>) and the radius of the circle in 3D
(<a href="#Radius"><i><code><span data-if="hdevelop" style="display:inline">Radius</span><span data-if="c" style="display:none">Radius</span><span data-if="cpp" style="display:none">Radius</span><span data-if="com" style="display:none">Radius</span><span data-if="dotnet" style="display:none">radius</span><span data-if="python" style="display:none">radius</span></code></i></a>), the 3D positions and orientations
(<a href="#Pose1"><i><code><span data-if="hdevelop" style="display:inline">Pose1</span><span data-if="c" style="display:none">Pose1</span><span data-if="cpp" style="display:none">Pose1</span><span data-if="com" style="display:none">Pose1</span><span data-if="dotnet" style="display:none">pose1</span><span data-if="python" style="display:none">pose_1</span></code></i></a>,<a href="#Pose2"><i><code><span data-if="hdevelop" style="display:inline">Pose2</span><span data-if="c" style="display:none">Pose2</span><span data-if="cpp" style="display:none">Pose2</span><span data-if="com" style="display:none">Pose2</span><span data-if="dotnet" style="display:none">pose2</span><span data-if="python" style="display:none">pose_2</span></code></i></a>) are determined in camera coordinates.
</p>
<p>Depending on the value of the parameter <a href="#OutputType"><i><code><span data-if="hdevelop" style="display:inline">OutputType</span><span data-if="c" style="display:none">OutputType</span><span data-if="cpp" style="display:none">OutputType</span><span data-if="com" style="display:none">OutputType</span><span data-if="dotnet" style="display:none">outputType</span><span data-if="python" style="display:none">output_type</span></code></i></a>, the
position and orientation is returned as a 3D pose
(<a href="#OutputType"><i><code><span data-if="hdevelop" style="display:inline">OutputType</span><span data-if="c" style="display:none">OutputType</span><span data-if="cpp" style="display:none">OutputType</span><span data-if="com" style="display:none">OutputType</span><span data-if="dotnet" style="display:none">outputType</span><span data-if="python" style="display:none">output_type</span></code></i></a> = <i><span data-if="hdevelop" style="display:inline">'pose'</span><span data-if="c" style="display:none">"pose"</span><span data-if="cpp" style="display:none">"pose"</span><span data-if="com" style="display:none">"pose"</span><span data-if="dotnet" style="display:none">"pose"</span><span data-if="python" style="display:none">"pose"</span></i>) or in the form of the
center of the 3D circle and the normal vector of the plane in which
the circle lies (<a href="#OutputType"><i><code><span data-if="hdevelop" style="display:inline">OutputType</span><span data-if="c" style="display:none">OutputType</span><span data-if="cpp" style="display:none">OutputType</span><span data-if="com" style="display:none">OutputType</span><span data-if="dotnet" style="display:none">outputType</span><span data-if="python" style="display:none">output_type</span></code></i></a> = <i><span data-if="hdevelop" style="display:inline">'center_normal'</span><span data-if="c" style="display:none">"center_normal"</span><span data-if="cpp" style="display:none">"center_normal"</span><span data-if="com" style="display:none">"center_normal"</span><span data-if="dotnet" style="display:none">"center_normal"</span><span data-if="python" style="display:none">"center_normal"</span></i>).
In the former case, the angle for the rotation around the z axis
is set to zero, because it cannot be determined.
In the latter case, the first three elements of the output parameters
<a href="#Pose1"><i><code><span data-if="hdevelop" style="display:inline">Pose1</span><span data-if="c" style="display:none">Pose1</span><span data-if="cpp" style="display:none">Pose1</span><span data-if="com" style="display:none">Pose1</span><span data-if="dotnet" style="display:none">pose1</span><span data-if="python" style="display:none">pose_1</span></code></i></a> and <a href="#Pose2"><i><code><span data-if="hdevelop" style="display:inline">Pose2</span><span data-if="c" style="display:none">Pose2</span><span data-if="cpp" style="display:none">Pose2</span><span data-if="com" style="display:none">Pose2</span><span data-if="dotnet" style="display:none">pose2</span><span data-if="python" style="display:none">pose_2</span></code></i></a> contain the position of the center
of the circle. The following three elements contain the normal vector.
The normal vectors are normalized and oriented such that they point away
from the optical center which is the origin of the camera coordinate
system. If <a href="#OutputType"><i><code><span data-if="hdevelop" style="display:inline">OutputType</span><span data-if="c" style="display:none">OutputType</span><span data-if="cpp" style="display:none">OutputType</span><span data-if="com" style="display:none">OutputType</span><span data-if="dotnet" style="display:none">outputType</span><span data-if="python" style="display:none">output_type</span></code></i></a> is set to <i><span data-if="hdevelop" style="display:inline">'center_normal'</span><span data-if="c" style="display:none">"center_normal"</span><span data-if="cpp" style="display:none">"center_normal"</span><span data-if="com" style="display:none">"center_normal"</span><span data-if="dotnet" style="display:none">"center_normal"</span><span data-if="python" style="display:none">"center_normal"</span></i>,
the output parameters <a href="#Pose1"><i><code><span data-if="hdevelop" style="display:inline">Pose1</span><span data-if="c" style="display:none">Pose1</span><span data-if="cpp" style="display:none">Pose1</span><span data-if="com" style="display:none">Pose1</span><span data-if="dotnet" style="display:none">pose1</span><span data-if="python" style="display:none">pose_1</span></code></i></a> and <a href="#Pose2"><i><code><span data-if="hdevelop" style="display:inline">Pose2</span><span data-if="c" style="display:none">Pose2</span><span data-if="cpp" style="display:none">Pose2</span><span data-if="com" style="display:none">Pose2</span><span data-if="dotnet" style="display:none">pose2</span><span data-if="python" style="display:none">pose_2</span></code></i></a> contain only
six elements which describe the position and orientation of the circle
instead of the seven elements of the 3D pose that are returned if
<a href="#OutputType"><i><code><span data-if="hdevelop" style="display:inline">OutputType</span><span data-if="c" style="display:none">OutputType</span><span data-if="cpp" style="display:none">OutputType</span><span data-if="com" style="display:none">OutputType</span><span data-if="dotnet" style="display:none">outputType</span><span data-if="python" style="display:none">output_type</span></code></i></a> is set to <i><span data-if="hdevelop" style="display:inline">'pose'</span><span data-if="c" style="display:none">"pose"</span><span data-if="cpp" style="display:none">"pose"</span><span data-if="com" style="display:none">"pose"</span><span data-if="dotnet" style="display:none">"pose"</span><span data-if="python" style="display:none">"pose"</span></i>.
</p>
<p>If more than one contour is passed in <a href="#Contour"><i><code><span data-if="hdevelop" style="display:inline">Contour</span><span data-if="c" style="display:none">Contour</span><span data-if="cpp" style="display:none">Contour</span><span data-if="com" style="display:none">Contour</span><span data-if="dotnet" style="display:none">contour</span><span data-if="python" style="display:none">contour</span></code></i></a>, <a href="#Radius"><i><code><span data-if="hdevelop" style="display:inline">Radius</span><span data-if="c" style="display:none">Radius</span><span data-if="cpp" style="display:none">Radius</span><span data-if="com" style="display:none">Radius</span><span data-if="dotnet" style="display:none">radius</span><span data-if="python" style="display:none">radius</span></code></i></a>
must either contain a tuple that contains a value for each contour or
only one value which is then used for all contours. The resulting
positions and orientations are stored one after another in <a href="#Pose1"><i><code><span data-if="hdevelop" style="display:inline">Pose1</span><span data-if="c" style="display:none">Pose1</span><span data-if="cpp" style="display:none">Pose1</span><span data-if="com" style="display:none">Pose1</span><span data-if="dotnet" style="display:none">pose1</span><span data-if="python" style="display:none">pose_1</span></code></i></a>
and <a href="#Pose2"><i><code><span data-if="hdevelop" style="display:inline">Pose2</span><span data-if="c" style="display:none">Pose2</span><span data-if="cpp" style="display:none">Pose2</span><span data-if="com" style="display:none">Pose2</span><span data-if="dotnet" style="display:none">pose2</span><span data-if="python" style="display:none">pose_2</span></code></i></a>, i.e., <a href="#Pose1"><i><code><span data-if="hdevelop" style="display:inline">Pose1</span><span data-if="c" style="display:none">Pose1</span><span data-if="cpp" style="display:none">Pose1</span><span data-if="com" style="display:none">Pose1</span><span data-if="dotnet" style="display:none">pose1</span><span data-if="python" style="display:none">pose_1</span></code></i></a> and <a href="#Pose2"><i><code><span data-if="hdevelop" style="display:inline">Pose2</span><span data-if="c" style="display:none">Pose2</span><span data-if="cpp" style="display:none">Pose2</span><span data-if="com" style="display:none">Pose2</span><span data-if="dotnet" style="display:none">pose2</span><span data-if="python" style="display:none">pose_2</span></code></i></a> contain
first the pose or the position and the normal vector of the first
contour, followed by the respective values for the second contour
and so on.
</p>
<h2 id="sec_attention">注意</h2>
<p>The accuracy of the determined poses depends heavily on the accuracy of
the extracted contours.
The extraction of curved edges using relatively large filter masks leads
to a slightly shifted edge position. Edge extraction approaches that
are based on the first derivative of the image function
(e.g., <a href="edges_sub_pix.html"><code><span data-if="hdevelop" style="display:inline">edges_sub_pix</span><span data-if="c" style="display:none">edges_sub_pix</span><span data-if="cpp" style="display:none">EdgesSubPix</span><span data-if="com" style="display:none">EdgesSubPix</span><span data-if="dotnet" style="display:none">EdgesSubPix</span><span data-if="python" style="display:none">edges_sub_pix</span></code></a>) yield edges that are shifted towards the
center of curvature, i.e., extracted ellipses will be slightly to small.
Approaches that are based on the second derivative of the image function
(<a href="laplace_of_gauss.html"><code><span data-if="hdevelop" style="display:inline">laplace_of_gauss</span><span data-if="c" style="display:none">laplace_of_gauss</span><span data-if="cpp" style="display:none">LaplaceOfGauss</span><span data-if="com" style="display:none">LaplaceOfGauss</span><span data-if="dotnet" style="display:none">LaplaceOfGauss</span><span data-if="python" style="display:none">laplace_of_gauss</span></code></a> followed by <a href="zero_crossing_sub_pix.html"><code><span data-if="hdevelop" style="display:inline">zero_crossing_sub_pix</span><span data-if="c" style="display:none">zero_crossing_sub_pix</span><span data-if="cpp" style="display:none">ZeroCrossingSubPix</span><span data-if="com" style="display:none">ZeroCrossingSubPix</span><span data-if="dotnet" style="display:none">ZeroCrossingSubPix</span><span data-if="python" style="display:none">zero_crossing_sub_pix</span></code></a>)
result in edges that are  shifted away from the center of curvature, i.e.,
extracted ellipses will be slightly too large.
</p>
<p>These effects increase with the curvature of the edge and with the size
of the filter mask that is used for the edge extraction. Therefore, to
achieve high accuracy, the ellipses should appear large in the image
and the filter parameter should be chosen such that small filter masks
are used (see <a href="info_edges.html"><code><span data-if="hdevelop" style="display:inline">info_edges</span><span data-if="c" style="display:none">info_edges</span><span data-if="cpp" style="display:none">InfoEdges</span><span data-if="com" style="display:none">InfoEdges</span><span data-if="dotnet" style="display:none">InfoEdges</span><span data-if="python" style="display:none">info_edges</span></code></a>).
</p>
<h2 id="sec_execution">运行信息</h2>
<ul>
  <li>多线程类型:可重入(与非独占操作符并行运行)。</li>
<li>多线程作用域:全局(可以从任何线程调用)。</li>
  <li>未经并行化处理。</li>
</ul>
<h2 id="sec_parameters">参数表</h2>
  <div class="par">
<div class="parhead">
<span id="Contour" class="parname"><b><code><span data-if="hdevelop" style="display:inline">Contour</span><span data-if="c" style="display:none">Contour</span><span data-if="cpp" style="display:none">Contour</span><span data-if="com" style="display:none">Contour</span><span data-if="dotnet" style="display:none">contour</span><span data-if="python" style="display:none">contour</span></code></b> (input_object)  </span><span>xld(-array) <code>→</code> <span data-if="hdevelop" style="display:inline">object</span><span data-if="dotnet" style="display:none"><a href="HXLD.html">HXLD</a></span><span data-if="python" style="display:none">HObject</span><span data-if="cpp" style="display:none"><a href="HXLD.html">HXLD</a></span><span data-if="c" style="display:none">Hobject</span></span>
</div>
<p class="pardesc">Contours to be examined.</p>
</div>
  <div class="par">
<div class="parhead">
<span id="CameraParam" class="parname"><b><code><span data-if="hdevelop" style="display:inline">CameraParam</span><span data-if="c" style="display:none">CameraParam</span><span data-if="cpp" style="display:none">CameraParam</span><span data-if="com" style="display:none">CameraParam</span><span data-if="dotnet" style="display:none">cameraParam</span><span data-if="python" style="display:none">camera_param</span></code></b> (input_control)  </span><span>campar <code>→</code> <span data-if="dotnet" style="display:none"><a href="HCamPar.html">HCamPar</a>, </span><span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">Sequence[Union[int, float, str]]</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (real / </span><span data-if="hdevelop" style="display:inline">integer / </span><span data-if="hdevelop" style="display:inline">string)</span><span data-if="dotnet" style="display:none"> (<i>double</i> / </span><span data-if="dotnet" style="display:none">int / </span><span data-if="dotnet" style="display:none">long / </span><span data-if="dotnet" style="display:none">string)</span><span data-if="cpp" style="display:none"> (<i>double</i> / </span><span data-if="cpp" style="display:none">Hlong / </span><span data-if="cpp" style="display:none">HString)</span><span data-if="c" style="display:none"> (<i>double</i> / </span><span data-if="c" style="display:none">Hlong / </span><span data-if="c" style="display:none">char*)</span></span>
</div>
<p class="pardesc">Internal camera parameters.</p>
</div>
  <div class="par">
<div class="parhead">
<span id="Radius" class="parname"><b><code><span data-if="hdevelop" style="display:inline">Radius</span><span data-if="c" style="display:none">Radius</span><span data-if="cpp" style="display:none">Radius</span><span data-if="com" style="display:none">Radius</span><span data-if="dotnet" style="display:none">radius</span><span data-if="python" style="display:none">radius</span></code></b> (input_control)  </span><span>number(-array) <code>→</code> <span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">MaybeSequence[float]</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (real)</span><span data-if="dotnet" style="display:none"> (<i>double</i>)</span><span data-if="cpp" style="display:none"> (<i>double</i>)</span><span data-if="c" style="display:none"> (<i>double</i>)</span></span>
</div>
<p class="pardesc">Radius of the circle in object space.</p>
<p class="pardesc"><span class="parcat">Number of elements:
      </span>Radius == Contour || Radius == 1</p>
<p class="pardesc"><span class="parcat">Restriction:
      </span><code>Radius &gt; 0.0</code></p>
</div>
  <div class="par">
<div class="parhead">
<span id="OutputType" class="parname"><b><code><span data-if="hdevelop" style="display:inline">OutputType</span><span data-if="c" style="display:none">OutputType</span><span data-if="cpp" style="display:none">OutputType</span><span data-if="com" style="display:none">OutputType</span><span data-if="dotnet" style="display:none">outputType</span><span data-if="python" style="display:none">output_type</span></code></b> (input_control)  </span><span>string <code>→</code> <span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">str</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (string)</span><span data-if="dotnet" style="display:none"> (<i>string</i>)</span><span data-if="cpp" style="display:none"> (<i>HString</i>)</span><span data-if="c" style="display:none"> (<i>char*</i>)</span></span>
</div>
<p class="pardesc">Type of output parameters.</p>
<p class="pardesc"><span class="parcat">Default:
      </span>
    <span data-if="hdevelop" style="display:inline">'pose'</span>
    <span data-if="c" style="display:none">"pose"</span>
    <span data-if="cpp" style="display:none">"pose"</span>
    <span data-if="com" style="display:none">"pose"</span>
    <span data-if="dotnet" style="display:none">"pose"</span>
    <span data-if="python" style="display:none">"pose"</span>
</p>
<p class="pardesc"><span class="parcat">List of values:
      </span><span data-if="hdevelop" style="display:inline">'center_normal'</span><span data-if="c" style="display:none">"center_normal"</span><span data-if="cpp" style="display:none">"center_normal"</span><span data-if="com" style="display:none">"center_normal"</span><span data-if="dotnet" style="display:none">"center_normal"</span><span data-if="python" style="display:none">"center_normal"</span>, <span data-if="hdevelop" style="display:inline">'pose'</span><span data-if="c" style="display:none">"pose"</span><span data-if="cpp" style="display:none">"pose"</span><span data-if="com" style="display:none">"pose"</span><span data-if="dotnet" style="display:none">"pose"</span><span data-if="python" style="display:none">"pose"</span></p>
</div>
  <div class="par">
<div class="parhead">
<span id="Pose1" class="parname"><b><code><span data-if="hdevelop" style="display:inline">Pose1</span><span data-if="c" style="display:none">Pose1</span><span data-if="cpp" style="display:none">Pose1</span><span data-if="com" style="display:none">Pose1</span><span data-if="dotnet" style="display:none">pose1</span><span data-if="python" style="display:none">pose_1</span></code></b> (output_control)  </span><span>real-array <code>→</code> <span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">Sequence[Union[float, int]]</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (real / </span><span data-if="hdevelop" style="display:inline">integer)</span><span data-if="dotnet" style="display:none"> (<i>double</i> / </span><span data-if="dotnet" style="display:none">int / </span><span data-if="dotnet" style="display:none">long)</span><span data-if="cpp" style="display:none"> (<i>double</i> / </span><span data-if="cpp" style="display:none">Hlong)</span><span data-if="c" style="display:none"> (<i>double</i> / </span><span data-if="c" style="display:none">Hlong)</span></span>
</div>
<p class="pardesc">3D pose of the first circle.</p>
<p class="pardesc"><span class="parcat">Number of elements:
      </span>Pose1 == 7 * Contour || Pose1 == 6 * Contour</p>
</div>
  <div class="par">
<div class="parhead">
<span id="Pose2" class="parname"><b><code><span data-if="hdevelop" style="display:inline">Pose2</span><span data-if="c" style="display:none">Pose2</span><span data-if="cpp" style="display:none">Pose2</span><span data-if="com" style="display:none">Pose2</span><span data-if="dotnet" style="display:none">pose2</span><span data-if="python" style="display:none">pose_2</span></code></b> (output_control)  </span><span>real-array <code>→</code> <span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">Sequence[Union[float, int]]</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (real / </span><span data-if="hdevelop" style="display:inline">integer)</span><span data-if="dotnet" style="display:none"> (<i>double</i> / </span><span data-if="dotnet" style="display:none">int / </span><span data-if="dotnet" style="display:none">long)</span><span data-if="cpp" style="display:none"> (<i>double</i> / </span><span data-if="cpp" style="display:none">Hlong)</span><span data-if="c" style="display:none"> (<i>double</i> / </span><span data-if="c" style="display:none">Hlong)</span></span>
</div>
<p class="pardesc">3D pose of the second circle.</p>
<p class="pardesc"><span class="parcat">Number of elements:
      </span>Pose2 == 7 * Contour || Pose2 == 6 * Contour</p>
</div>
<h2 id="sec_result">结果</h2>
<p><code><span data-if="hdevelop" style="display:inline">get_circle_pose</span><span data-if="c" style="display:none">get_circle_pose</span><span data-if="cpp" style="display:none">GetCirclePose</span><span data-if="com" style="display:none">GetCirclePose</span><span data-if="dotnet" style="display:none">GetCirclePose</span><span data-if="python" style="display:none">get_circle_pose</span></code> returns <TT>2</TT> (
      <TT>H_MSG_TRUE</TT>)
     if all parameter values are
correct and the position of the circle has been determined successfully.
如有必要，将引发异常。</p>
<h2 id="sec_predecessors">可能的前置算子</h2>
<p>
<code><a href="edges_sub_pix.html"><span data-if="hdevelop" style="display:inline">edges_sub_pix</span><span data-if="c" style="display:none">edges_sub_pix</span><span data-if="cpp" style="display:none">EdgesSubPix</span><span data-if="com" style="display:none">EdgesSubPix</span><span data-if="dotnet" style="display:none">EdgesSubPix</span><span data-if="python" style="display:none">edges_sub_pix</span></a></code>
</p>
<h2 id="sec_alternatives">可替代算子</h2>
<p>
<code><a href="find_marks_and_pose.html"><span data-if="hdevelop" style="display:inline">find_marks_and_pose</span><span data-if="c" style="display:none">find_marks_and_pose</span><span data-if="cpp" style="display:none">FindMarksAndPose</span><span data-if="com" style="display:none">FindMarksAndPose</span><span data-if="dotnet" style="display:none">FindMarksAndPose</span><span data-if="python" style="display:none">find_marks_and_pose</span></a></code>, 
<code><a href="camera_calibration.html"><span data-if="hdevelop" style="display:inline">camera_calibration</span><span data-if="c" style="display:none">camera_calibration</span><span data-if="cpp" style="display:none">CameraCalibration</span><span data-if="com" style="display:none">CameraCalibration</span><span data-if="dotnet" style="display:none">CameraCalibration</span><span data-if="python" style="display:none">camera_calibration</span></a></code>
</p>
<h2 id="sec_see">参考其它</h2>
<p>
<code><a href="get_rectangle_pose.html"><span data-if="hdevelop" style="display:inline">get_rectangle_pose</span><span data-if="c" style="display:none">get_rectangle_pose</span><span data-if="cpp" style="display:none">GetRectanglePose</span><span data-if="com" style="display:none">GetRectanglePose</span><span data-if="dotnet" style="display:none">GetRectanglePose</span><span data-if="python" style="display:none">get_rectangle_pose</span></a></code>, 
<code><a href="fit_ellipse_contour_xld.html"><span data-if="hdevelop" style="display:inline">fit_ellipse_contour_xld</span><span data-if="c" style="display:none">fit_ellipse_contour_xld</span><span data-if="cpp" style="display:none">FitEllipseContourXld</span><span data-if="com" style="display:none">FitEllipseContourXld</span><span data-if="dotnet" style="display:none">FitEllipseContourXld</span><span data-if="python" style="display:none">fit_ellipse_contour_xld</span></a></code>
</p>
<h2 id="sec_module">模块</h2>
<p>
3D Metrology</p>
<!--OP_REF_FOOTER_START-->
<hr>
<div class="indexlink">
<a href="index_classes.html"><span data-if="dotnet" style="display:none;">类别</span><span data-if="cpp" style="display:none;">类别</span></a><span data-if="dotnet" style="display:none;"> | </span><span data-if="cpp" style="display:none;"> | </span><a href="index_by_name.html">算子列表</a>
</div>
<div class="footer">
<div class="copyright">HALCON算子参考手册 Copyright © 2015-2023 51Halcon</div>
</div>
</div>
</body>
</html>
